From 488f5a5e7fd1b8917d639cd9fba64720dfb8ee02 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Thu, 30 Aug 2012 21:11:57 +0900 Subject: [PATCH] qp.el (quoted-printable-decode-region): Decode multiple bytes at once. --- lisp/gnus/ChangeLog | 5 +++++ lisp/gnus/qp.el | 22 +++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 7bc40e521e9..b19f8dc6560 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,8 @@ +2012-08-30 Kenichi Handa + + * qp.el (quoted-printable-decode-region): Decode multiple bytes at + once. + 2012-08-29 Julien Danjou * gnus-notifications.el: New file. diff --git a/lisp/gnus/qp.el b/lisp/gnus/qp.el index c8481aa9dee..87252684a48 100644 --- a/lisp/gnus/qp.el +++ b/lisp/gnus/qp.el @@ -53,7 +53,10 @@ them into characters should be done separately." ;; or both of which are lowercase letters in "abcdef", is ;; formally illegal. A robust implementation might choose to ;; recognize them as the corresponding uppercase letters.'' - (let ((case-fold-search t)) + (let ((case-fold-search t) + (decode-hex #'(lambda (n1 n2) + (+ (* (if (<= n1 ?9) (- n1 ?0) (+ (- n1 ?A) 10)) 16) + (if (<= n2 ?9) (- n2 ?0) (+ (- n2 ?A) 10)))))) (narrow-to-region from to) ;; Do this in case we're called from Gnus, say, in a buffer ;; which already contains non-ASCII characters which would @@ -65,12 +68,17 @@ them into characters should be done separately." (not (eobp))) (cond ((eq (char-after (1+ (point))) ?\n) (delete-char 2)) - ((looking-at "=[0-9A-F][0-9A-F]") - (let ((byte (string-to-number (buffer-substring (1+ (point)) - (+ 3 (point))) - 16))) - (mm-insert-byte byte 1) - (delete-char 3))) + ((looking-at "\\(=[0-9A-F][0-9A-F]\\)+") + ;; Decode this sequence at once; i.e. by a single + ;; deletion and insertion. + (let* ((n (/ (- (match-end 0) (point)) 3)) + (str (make-string n 0))) + (dotimes (i n) + (aset str i (funcall decode-hex (char-after (1+ (point))) + (char-after (+ 2 (point))))) + (forward-char 3)) + (delete-region (match-beginning 0) (match-end 0)) + (insert str))) (t (message "Malformed quoted-printable text") (forward-char))))) -- 2.30.2